package com.neuedu.corejava.ch9;

import com.neuedu.corejava.ch8.Student;

public class ObjectClass {
	public static void main(String[] args) {
		// 新建三个字符串并判断是否相等
		String s1 = "abc"; //在常量池创建"abc"
		//在常量池创建"abc",并复制一个对象到堆，实际上创建了两个对象
		String s2 = new String("abc");
		String s3 = new String("abc");
		String s4 = "abc";
		//字符串在储存是都会在常量池中进行保存，每个不同字符串都会有自己的储存空间
		//常量池是java语言提供的一种特殊的内存结构，用于储存程序运行过程中的常量
		//==运算符号在判断对象（引用数据类型）时，判断两个对象的地址是否相同
//		System.out.println(s1 == s2);
//		System.out.println(s2 == s3);
//		System.out.println(s1 == s4);
		
		//判断两个对象值是否相等应该使用java.lang.Object提供的equals方法
		//String类重写了equals方法
//		System.out.println(s1.equals(s2));
//		System.out.println(s1.equals(s4));
//		System.out.println(s2.equals(s3));
		
		Student stu1 = new Student(s1, 0);
		Student stu2 = new Student(s1, 0);
		Student stu3 = stu1;
		System.out.println(stu1==stu2);
		System.out.println(stu1.equals(stu2));
		
		System.out.println(stu1==stu3);
		System.out.println(stu1.equals(stu3));
		//哈希码是通过哈希算法为每一个对象计算出的唯一值，即每个对象的哈希值都是不同的
		//equals方法就是判断哈希值是否相同，故equals方法默认判断两个对象的引用是否指向同一个对象
		System.out.println(stu1.hashCode());
		System.out.println(stu2.hashCode());
		System.out.println(stu3.hashCode());
		//当使用输出语句输出一个对象时，默认调用该对象的toString()方法把对象转换成字符串进行输出
		System.out.println(stu3);//输出类名@hashCode（16进制）
		System.out.println(stu3.toString());
		//如果要输出对象的数据，则要重写toString方法
		
	}
}
